home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / c_lib01.arc / CHMOD.C < prev    next >
Text File  |  1985-10-16  |  9KB  |  212 lines

  1. 1
  2.  /***********************************************************************/
  3.  /* CHMOD - EXERCISE CHMOD DOS FUNCTION CALL (#43)                      */
  4.  /***********************************************************************/
  5.  /* (C) COPYRIGHT JERRY M. CARLIN 8/14/1983                             */
  6.  /* PERMISSION GIVEN TO USE OR DISTRIBUTE SO LONG AS NO MONEY CHARGED.  */
  7.  /* IF QUESTIONS, CALL 415-680-7590.                                    */
  8.  /***********************************************************************/
  9. /*
  10. #DEFINE DEBUG 1
  11. */
  12. #INCLUDE "STDIO.H"
  13. #DEFINE CARRY  1        /* 8086 FLAGS CARRY BIT */
  14. #DEFINE NO_MORE 18      /* DOS 'NO MORE FILES' ERROR CODE */
  15. #DEFINE FCALL  0X21     /* FUNCTION CALL INT PER DOS 2.0 MANUAL PG D-2 */
  16. #DEFINE CHMOD  0X43     /* DOS 2.0 CHANGE FILE MODE PG D-39 */
  17. #DEFINE SETDTA 0X1A     /* SET DISK TRANSFER ADDRESS */
  18. #DEFINE FFIRST 0X4E     /* DOS 2.0 FIND FIRST FILE */
  19. #DEFINE FNEXT  0X4F     /* DOS 2.0 FIND NEXT FILE */
  20.  /* FILE ATTRIBUTES FROM DOS 2.0 MANUAL PAGE C-4 */
  21. #DEFINE RO     01       /* READ ONLY */
  22. #DEFINE HIDE   02       /* HIDDEN FILE */
  23. #DEFINE SYS    04       /* SYSTEM FILE */
  24. #DEFINE VOLLBL 08       /* SPECIAL VOLUME LABEL - IN FIRST 11 BYTES */
  25. #DEFINE SUBDIR 0X10     /* DEFINES A SUBDIRECTORY */
  26. #DEFINE ARCHV  0X20     /* ARCHIVE BIT */
  27. CHAR *INDEX();
  28. STRUCT REGVAL {
  29.         UNSIGNED AX,BX,CX,DX,SI,DI,DS,ES;
  30. } IREGS, OREGS, FILEREGS;
  31. STRUCT SEGREG {
  32.         UNSIGNED CS,SS,SDS,SES;
  33. } SR;
  34. MAIN(AC,AV)
  35. INT AC;
  36. CHAR *AV[];
  37. {
  38.         CHAR ATTR[9];           /* FILE ATTRIBUTES */
  39.         INT FLAGS;              /* 8086 FLAG REGISTER */
  40.         CHAR BUFF[128];         /* DISK I/O BUFFER */
  41.         CHAR FULLNAME[128];     /* FULL FILE NAME INCLUDING DRIVE AND DIR */
  42.         CHAR DDPREFIX[120];     /* DRIVE AND DIRECTORY INFO */
  43.         INT I;
  44.         BDOS(SETDTA,BUFF);      /* SET DATA TRANSFER ADDRESS */
  45.         IREGS.AX = 17152;       /* SET AH = 43 */
  46.         SEGREAD(&SR);           /* GET STACK & DATA SEG REGS */
  47.         IREGS.DS = SR.SDS;
  48.         IREGS.ES = SR.SES;
  49.         FILEREGS.DS = IREGS.DS;
  50.         FILEREGS.ES = IREGS.ES;
  51.         FILEREGS.AX = 0X4E00;                   /* FIND FIRST */
  52.         FILEREGS.CX = HIDE | SYS | SUBDIR;      /* ALLOW ANY FILE */
  53.         IF (STRCMP(AV[1],"HELP") == 0 || STRCMP(AV[1],"?") == 0 || AC == 1)
  54.         {
  55.                 PRINTF("\NCHMOD [-[R][H][S][A]] FILENAME.EXT ");
  56.                 PRINTF("[FILENAME.EXT...]\N");
  57.                 PRINTF("\NUSE THE '-' OPTION TO SET FILE MODES. OMIT");
  58.                 PRINTF(" THE '-' OPTION FOR MODE DISPLAY.\NA DASH BY ");
  59.                 PRINTF(" ITSELF (CHMOD - FILENAME) SETS NORMAL MODE.\N\N");
  60.                 PRINTF("SETTABLE FLAGS:\N  R = READ ONLY\N");
  61.                 PRINTF("  H = HIDDEN\N  S = SYSTEM");
  62.                 PRINTF("\N  A = ARCHIVE\N\NANY FLAG NOT SET WILL BE RESET.");
  63.                 PRINTF(" THIS MEANS THAT IF YOU DO NOT, \NFOR EXAMPLE, SET");
  64.                 PRINTF(" READ-ONLY THE FILE WILL BE WRITE ENABLED.\N\N");
  65.                 PRINTF("DOS GLOBAL FILENAME CHARS '*' AND '?' MAY BE USED.\N");
  66.                 PRINTF("\NMODE DISPLAY INCLUDES 'W' FOR WRITE OK AND ");
  67.                 PRINTF("'D' FOR A SUBDIRECTORY.\N\N");
  68.                 EXIT(0);
  69.         }
  70.         IF (AV[1][0] == '-')    /* SET MODE */
  71.         {
  72.                 IREGS.AX |= 1;  /* SET UPDATE BIT */
  73.                 IREGS.CX = 0;
  74.                 IF (INDEX(AV[1],'R') != 0)
  75.                         IREGS.CX |= RO;
  76.                 IF (INDEX(AV[1],'H') != 0)
  77.                         IREGS.CX |= HIDE;
  78.                 IF (INDEX(AV[1],'S') != 0)
  79.                         IREGS.CX |= SYS;
  80.                 IF (INDEX(AV[1],'A') != 0)
  81.                         IREGS.CX |= ARCHV;
  82. #IFDEF DEBUG
  83.                 PRINTF("FUN CODE =%X\N",IREGS.AX);
  84.                 PRINTF("SET MODE =%X\N",IREGS.CX);
  85. #ENDIF
  86.                 ++AV;   /* SKIP OVER SET MODE WORD */
  87.                 --AC;
  88.                 WHILE (--AC > 0)
  89.                 {
  90.                         FILEREGS.DX = *++AV;
  91.                         FLAGS = SYSINT(FCALL,&FILEREGS,&OREGS);
  92.                         IF (FLAGS & CARRY)
  93.                         {
  94.                                 PERROR(FILEREGS.DX,OREGS.AX);
  95.                                 CONTINUE;
  96.                         }
  97.                         BUILDP(*AV,DDPREFIX);
  98.                         WHILE (OREGS.AX != NO_MORE)
  99.                         {
  100.                                 STRCPY(FULLNAME,DDPREFIX);
  101.                                 STRCAT(FULLNAME,BUFF+30);
  102.                                 IREGS.DX = FULLNAME;
  103.                                 FLAGS = SYSINT(FCALL,&IREGS,&OREGS);
  104.                                 IF (FLAGS & CARRY)
  105.                                         PERROR(IREGS.DX,OREGS.AX);
  106.                                 OREGS.AX = BDOS(FNEXT,0) & 0XFF;
  107.                         }
  108.                 }
  109.                 EXIT(0);
  110.         }
  111.  /**********************************/
  112.  /* ELSE REPORT ON CURRENT SETTING */
  113.  /**********************************/
  114.         WHILE (--AC > 0)
  115.         {
  116.                 FILEREGS.DX = *++AV;
  117.                 FLAGS = SYSINT(FCALL,&FILEREGS,&OREGS);   /* FIND FIRST */
  118.                 IF (FLAGS & CARRY)
  119.                 {
  120.                         PERROR(FILEREGS.DX,OREGS.AX);
  121.                         CONTINUE;
  122.                 }
  123.                 I = 0;
  124.                 BUILDP(*AV,DDPREFIX);
  125.                 WHILE (I != NO_MORE)
  126.                 {
  127.                         STRCPY(FULLNAME,DDPREFIX);
  128.                         STRCAT(FULLNAME,BUFF+30);       /* SEE PG D-49 */
  129.                         IREGS.DX = FULLNAME;            /* NEXT FILE */
  130.                         FLAGS = SYSINT(FCALL,&IREGS,&OREGS);
  131. #IFDEF DEBUG
  132.                         PRINTF("FILE     = %S\N",IREGS.DX);
  133.                         PRINTF("ERR CODE = %X\N",OREGS.AX);
  134.                         PRINTF("8086FLAGS= %X\N",FLAGS);
  135.                         PRINTF("MODE BYTE= %D\N",OREGS.CX);
  136. #ENDIF
  137.                         IF (FLAGS & CARRY)
  138.                         {
  139.                                 PERROR(IREGS.DX,OREGS.AX);
  140.                                 BREAK;
  141.                         }
  142.                         IF (OREGS.CX & RO)
  143.                                 ATTR[0] = 'R';
  144.                         ELSE
  145.                                 ATTR[0] = 'W';
  146.                         IF (OREGS.CX & HIDE)
  147.                                 ATTR[1] = 'H';
  148.                         ELSE
  149.                                 ATTR[1] = '-';
  150.                         IF (OREGS.CX & SYS)
  151.                                 ATTR[2] = 'S';
  152.                         ELSE
  153.                                 ATTR[2] = '-';
  154.                         IF (OREGS.CX & SUBDIR)
  155.                                 ATTR[3] = 'D';
  156.                         ELSE
  157.                                 ATTR[3] = '-';
  158.                         IF (OREGS.CX & ARCHV)
  159.                                 ATTR[4] = 'A';
  160.                         ELSE
  161.                                 ATTR[4] = '-';
  162.                         ATTR[5] = '\0';
  163.                         PRINTF("%S %S\N",ATTR,IREGS.DX);
  164.                         I = BDOS(FNEXT,0) & 0XFF;  /* FIND NEXT */
  165.                 }
  166.         }
  167.         EXIT(0);
  168. }
  169.  /*****************************************************************/
  170.  /* PRINT ERROR - SEE ERROR RETURN TABLE DOS 2.0 MANUAL PAGE D-14 */
  171.  /*****************************************************************/
  172. PERROR(S,CODE)
  173. CHAR *S;
  174. UNSIGNED CODE;
  175. {
  176.         PRINTF("CHMOD: FILE %S",S);
  177.         SWITCH(CODE) {
  178.         CASE 2:
  179.         CASE 18: /* PERROR CALLED WITH 18 IF BAD FILENAME ENTERED */
  180.                 PRINTF(" NOT FOUND.\N");
  181.                 BREAK;
  182.         CASE 3:
  183.                 PRINTF(". PATH NOT FOUND.\N");
  184.                 BREAK;
  185.         CASE 5:
  186.                 PRINTF(". ACCESS DENIED.\N");
  187.                 BREAK;
  188.         DEFAULT:
  189.                 PRINTF(". DOS ERROR CODE %U RETURNED.\N",CODE);
  190.         }
  191.         RETURN;
  192. }
  193.  /********************************************************/
  194.  /* BUILD PREFIX STR CONTAINING DRIVE AND DIRECTORY INFO */
  195.  /* NEEDED SINCE FFIRST DTA DOES NOT STORE THIS INFO     */
  196.  /********************************************************/
  197. BUILDP(FULLNAME,DDPREFIX)
  198. CHAR *FULLNAME; /* FULL PATH NAME (INPUT) */
  199. CHAR *DDPREFIX; /* DRIVE AND DIRECTORY INFO */
  200. {
  201. #IFDEF DEBUG
  202.         CHAR *SAVEP;
  203.         SAVEP = DDPREFIX;
  204. #ENDIF
  205.         WHILE ((INDEX(FULLNAME,':') != 0) || (INDEX(FULLNAME,'\\') != 0))
  206.                 *DDPREFIX++ = *FULLNAME++;
  207.         *DDPREFIX = '\0';
  208. #IFDEF DEBUG
  209.         PRINTF("PREFIX=%S\N",SAVEP);
  210. #ENDIF
  211. }
  212. PRESS ENTER TO CONTINUE: